using Microsoft.AspNetCore.Mvc;
using TaskApi.Interfaces;

namespace TaskApi.Controllers;

//  创建⼀个名为TasksController的控制器，使⽤IRepository<Task>实现以下功能：
//  GET /api/tasks：获取所有任务。
//  GET /api/tasks/{id}：根据任务ID获取单个任务。
//  POST /api/tasks：添加⼀个新的任务。
//  PUT /api/tasks/{id}：更新指定ID的任务。
//  DELETE /api/tasks/{id} ：删除指定ID的任务
[ApiController]
[Route("/api/[controller]")]
public class TaskController : ControllerBase
{

    // [HttpGet]
    // public IActionResult Get()
    // {
    //     return Ok("Hello, World!");
    // }

    private readonly IRepository<Task> _taskRepository;

    public TaskController(IRepository<Task> taskRepository)
    {
        _taskRepository = taskRepository;
    }
    //GET /api/tasks：获取所有任务。
    [HttpGet]
    public async Task<ActionResult<IEnumerable<Task>>> GetAllTasks()
    {
        var tasks = await _taskRepository.GetAllAsync();
        return Ok(tasks);
    }

    //GET /api/tasks/{id}：根据任务ID获取单个任务。
    [HttpGet("{id}")]
    public async Task<ActionResult<Task>> GetById(int id)
    {
        var task = await _taskRepository.GetByIdAsync(id);
        if (task == null)
        {
            return NotFound();
        }
        return Ok(task);
    }

    //POST /api/tasks：添加⼀个新的任务。
    [HttpPost]
    public async Task<ActionResult<Task>> CreateTask(Task task)
    {

        var createdTask = await _taskRepository.CreateAsync(task);

        return Ok(createdTask);
    }

    //PUT /api/tasks/{id}：更新指定ID的任务。
    [HttpPut("{id}")]
    public async Task<IActionResult> UpdateTask(int id,Task task)
    {
        if(id != task.Id){
            return BadRequest("失败");
        }

        var existingTask = await _taskRepository.GetByIdAsync(id);
        if (existingTask == null)
        {
            return NotFound();
        }

        try
        {
            await _taskRepository.UpdateAsync(task);
        }
        catch
        {
            return StatusCode(500);
        }
        return NoContent();
    }

    //DELETE /api/tasks/{id} ：删除指定ID的任务
    [HttpDelete("{id}")]
    public async Task<IActionResult> DelectTask(int id)
    {
        var task = await _taskRepository.GetByIdAsync(id);
        if(task == null)
        {
            return NotFound();
        }
        await _taskRepository.DeleteAsync(id);

        return NoContent();
    }

}